home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 1.toast / Sample Code / Networking / TPIFile / Victim < prev   
Encoding:
Internet Message Format  |  2000-09-28  |  26.6 KB  |  [TEXT/R*ch]

  1. Subject:     Whitepaper on Objective-C (very VERY long - 7 pgs.)
  2. Sent:        12/31/96 12:48
  3. Received:    12/31/96 13:55
  4. From:        DLN, dneumann@next.com
  5. Reply-To:    Semper.Fi, semper.fi@solutions.apple.com
  6. To:          Subscribers to, semper.fi@solutions.apple.com
  7.  
  8.     Below is an RTF version of a whitepaper I wrote on the value-add of
  9. Objective-C.  How it complements other languages.  It's long, but I 
  10. thought
  11. this list would appreciate it given the natural high frequency of Obj-C
  12. questions.  
  13.     Please don't flame.  I realize its way above the list's etiquette size 
  14. but
  15. I thought it worth the inconvenience trade-off.  
  16.     There are a lot of issues covered below -- not just syntax and
  17. feature-list but the impact on the developer due to a combination of
  18. features.  I try to explain not just the What of Objective-C but the Why 
  19. of
  20. it as well.  The paper covers:
  21.  
  22. - language integration
  23. - component features
  24. - code reuse
  25. - typing options
  26. - protocols, categories, posing, forwarding, and other language features
  27. - delegation, notification, generic coding, exceptions, and other language
  28. enabling framework features
  29. - how messaging works and other performance related features
  30.  
  31.  
  32.  
  33.  
  34.  
  35. THE VALUE-ADD OF OBJECTIVE-C
  36.  
  37. Executive Summary
  38.     Objective-C, a super-set of ANSI C with object oriented extensions, is 
  39. one
  40. of several implementation languages used to craft custom application and
  41. business logic in NeXT's OPENSTEP and WebObjects environments. NeXT also
  42. supports non-C-based varieties such as WebScript and (to an increasing
  43. degree) Java. In fact the strong kinship between Objective-C and Java 
  44. let's
  45. developers wrap legacy C-based code in Objective-C classes and subclass
  46. these as Java classes (using standard industry JVMs) & visa versa.
  47.     However, in addition to a strong Java interface, Objective-C has its own
  48. value-adds that help enrich the development environment and complement the
  49. other language alternatives available to the NeXT developer.  Objective-C
  50. has been described as the "ultimate glue language" capable of wiring
  51. together both the highest and lowest levels of programming logic via a
  52. single paradigm, Objective-C method implementations. Thus a developer 
  53. using
  54. NeXT's tools might integrate disparate programming resources such as
  55. critical C and C++ code along side NeXT's Objective-C code within the
  56. implementation of any method. At the same time - due to Objective-C's
  57. dynamic "pluggable" architecture - it is easy to interface Objective-C
  58. objects with high level components (such as OLE/COM objects in the Windows
  59. space) and create completely new high-level components. 
  60.     Apart from the integration features of Objective-C for preserving and
  61. leveraging investment, there are many other value-adds. Objective-C can
  62. enable programs to work more dynamically without sacrificing reliability.
  63. It can also enhance reuse through flexibility without sacrificing
  64. performance. 
  65.  
  66.  
  67. I.  Unifying Component Assembly & Building
  68.  
  69.     Any time you add a new method or add an instance variable to a class
  70. written in C++, any class that references the altered class in will 
  71. require
  72. re-compilation (in most C++ implementations). Without recompilation the 
  73. app
  74. will "break." The only way to prevent the fragile superclass problem is to
  75. exorcize use of C++'s object oriented features which defeats the more
  76. provocative reasons for using C++ in the first place. To address different
  77. aspects of the fragile superclass problem, one predominant solution has
  78. achieved widespread attention: "componentware" -- entire application
  79. programming architectures for carrying out component development.  A
  80. problem with such approaches is that the tasks of assembly are very
  81. different from the tasks of development. Wouldn't it be nice if
  82. componentware was supported inside the language (at any granularity) such
  83. that component creation and assembly was implicit and routine?
  84.     Objective-C was designed from the beginning to encourage the creation of
  85. shareable dynamic components or "Software ICs". 
  86. Objective-C excels in the creation of Software ICs enabling the dynamic
  87. loading of custom code into running applications.  In addition, thanks to
  88. its ability to incorporate legacy 3GL resources, Objective-C does not 
  89. force
  90. developers to abandon perfectly good code that happened to be written in
  91. the "wrong" language.  Merely being an Objective-C object means that that
  92. object can be dynamically manipulated, wired together with other
  93. components, and even become an OLE/COM object (via the NeXTORB) on Windows
  94. platforms. According to BYTE in an August 1996 article discussing language
  95. flexibility and components: "If functions can migrate both into and out of
  96. a component as a project evolves, that's helpful. A common language for
  97. components and glue makes this possible. NextStep programmers have
  98. exploited this synergy for years." 
  99.  
  100. Integrating 3GL Resources
  101.  
  102. Developers may access legacy APIs in C and C++ along side those APIs from
  103. NeXT in Objective-C. As an example of an Objective-C method that
  104. incorporates C++, here is an initialization method for an Objective-C
  105. object. (An initialization method is similar to a C++ constructor.) The
  106. method sets values for some of the object's instance variables. The sample
  107. code was borrowed from a Calculator example supplied with NeXT's
  108. development tools.
  109.  
  110. - init
  111. {
  112.     cplus_object = new CalcEngine;   
  113.     previousAction = 0; 
  114.     return self;
  115. }
  116.  
  117. The first line creates a C++ object and assigns it to an instance variable
  118. of the Objective-C object known as cplus_object. "CalcEngine" is the class
  119. of the C++ object. The next line simply assigns the value of 0 to a C
  120. integer called previousAction. The following Objective-C method
  121. implementation is an example of how C++ might be involved in handling a
  122. user's action from within an Objective-C method:
  123.  
  124. - equalsKey:sender
  125. {
  126.     [display setDoubleValue:cplus_object->equalsKey( [theTextField
  127. doubleValue] )];
  128. }
  129.  
  130. Note that Objective-C messages follow the pattern of Smalltalk: an object
  131. reference followed by a method name and its arguments. The message
  132. statement is surrounded by brackets to denote where it begins and ends.
  133. Above we have an Objective-C message inside a C++ member function call
  134. inside another Objective-C message. The inner Objective-C message returns 
  135. a
  136. C double that gets passed into the C++ member function as an argument. The
  137. C++ member function returns another C double which, in turn, is passed as
  138. an argument to the outer Objective-C message.
  139.  
  140. Wiring it Together
  141.  
  142. In NeXT's Interface Builder, the developer can wire together live
  143. (compiled) objects and enhance Interface Builder itself on the fly. 
  144. Deployed applications can be extended with new features or patched using
  145. dynamic loading of new code.  Any Objective-C object can be scripted in
  146. NeXT's scripting language derivative of Objective-C called WebScript.  Via
  147. the NeXTORB on Windows platforms, this scripting can be extended to any
  148. application that supports OLE Automation such as Visual Basic and 
  149. Microsoft
  150. Excel.
  151.  
  152.  
  153.  
  154.  
  155. II. Flexibility
  156.  
  157. Most of the individual features exhibited by Objective-C are intertwined 
  158. in
  159. subtle and not so subtle ways. The presence of one feature and its success
  160. depend on (or can be greatly enhanced by) the presence other features. To
  161. evaluate the merits of one feature in isolation can often be irrelevant or
  162. misleading. For example, Objective-C supports dynamic typing and dynamic
  163. binding. Neither of these features would be very worthwhile (or even
  164. desirable) without - among other things - a consistent, feature rich
  165. runtime information management system available to all objects. 
  166.  
  167. Reliable and Dynamic
  168.  
  169.     Many advocates of interpreted languages like Smalltalk have long stressed
  170. the advantages of dynamic binding and typing such as rapid prototyping.
  171. However advocates of the strongly typed languages like C++ have also
  172. stressed the reliability and discipline advantages offered by programs
  173. developed with compile-time type checking. So how can code exhibit 
  174. dynamism
  175. which is so important to flexibility and extensibility and still offer
  176. bullet-proof reliability at runtime? For starters, Objective-C offers both
  177. dynamic and compile-time type checking. Developers can decide when and
  178. where dynamic typing makes sense and use "static" typing where 
  179. appropriate.
  180.  But the language designers went beyond supporting just class type 
  181. checking
  182. alternatives. 
  183.  
  184. Protocols
  185.     Although similar to a class definition (or class interface), an
  186. Objective-C Protocol does not define a class (which implies both behavior
  187. and data structure); rather, it defines pure behavior. Essentially a
  188. Protocol is nothing more than a group of related methods given a name in a
  189. manner analogous to how classes are named. Although Protocols aren't
  190. attached to the class hierarchy, they may be related to each other via
  191. inheritance (multiple inheritance actually) to capture behavior
  192. similarities.  In this sense, Protocols are an IDL (analogous to the OO
  193. CORBA IDL) but supported at the language level. (As you might imagine,
  194. Protocols make distributed object programming rather natural in
  195. Objective-C.)
  196.     Any number of completely different classes can "adopt" one or more
  197. Protocols. If a class adopts a protocol, the Objective-C compiler will
  198. check that it implements all the methods in the Protocol. Furthermore,
  199. objects can be dynamically typed in Objective-C while still being 
  200. "behavior
  201. typed" by a Protocol.   This allows the developer to let the actual class
  202. be resolved at runtime regardless of its position in the class hierarchy
  203. and still get all the benefits of type checking - that is, you find out at
  204. compile time if you are sending messages to an object that can't handle
  205. them. Developers do not have to hardcode expected classes in their object
  206. offerings just to achieve reliability. 
  207.     Different companies and/or different developers sharing a Protocol can
  208. exchange or mix code (in compiled form no less) with no knowledge of each
  209. other's class structures or internal implementation decisions - and yet
  210. have complete confidence their pieces will work together. Developers need
  211. only publish the Protocols they wish to export and the Protocols they
  212. expect client components to implement.
  213.  
  214. Runtime Type Information Repository
  215.     Objective-C has a rich runtime system in contrast to static languages 
  216. that
  217. have virtually none. For instance, when you get a reference to a C++ 
  218. object
  219. and wish to tell it to do something, you usually do so using a pointer to
  220. list of function pointers. You don't know what type of object you have at
  221. runtime and can't find out. If the language didn't enforce strict type
  222. checking at compile time, these pointers could be pointing to almost
  223. anything except a valid function - and lead to frequent general protection
  224. faults (crashes).
  225. However, in Objective-C, dynamic typing and dynamic binding are routine 
  226. and
  227. don't constrain design. Because of the Objective-C runtime information
  228. repository, Objective-C objects aren't just pointers being dereferenced.
  229. They are "alive" at runtime. Objective-C objects know who they are and can
  230. offer information about their class, their adopted Protocols, and their
  231. ability to respond to a given method. They have enough information to
  232. "introspect" themselves and if necessary have some other object handle a
  233. message sent their way.  A new class can join the runtime and instances of
  234. that class can join the running object network. 
  235.     But how can objects (and the developers using them) absolutely count on
  236. the runtime support being there in every object? Afterall, a reliable,
  237. common, rich API for all objects isn't achievable if separate (multiple)
  238. inheritance trees are allowed since some objects would inherit from
  239. different roots with different APIs (or not inherit from the right root at
  240. all!). This requirement of common basic functionality for all objects
  241. implies single implementation inheritance which is enforced by 
  242. Objective-C.
  243.  
  244. Exceptions
  245.     NeXT's OO Foundation Framework offers Objective-C developers NSException
  246. objects. When an exception occurs, an NSException object is created
  247. containing information about the exception. This object may be used to
  248. handle the problem. If unhandled, the NSException object gets passed up 
  249. the
  250. stack of methods involved in handling the user's action. One important
  251. feature about the exception handling system is that it functions in a
  252. manner transparent to interprocess or intermachine communication. NeXT's
  253. Distributed Objects system will "forward" exceptions over the wire across
  254. address spaces allowing client objects to handle exceptions that weren't
  255. handled on a remote server.
  256.  
  257.  
  258. Reuse, Reuse, Reuse 
  259.  
  260. There is no such thing as a single form of reuse. There are actually many
  261. forms and mechanisms. However, in a discussion of 3GLs, reuse by
  262. inheritance is emphasized almost exclusively. Meanwhile authors familiar
  263. with 4GLs emphasize reuse by composition because inhertaince is often
  264. impossible within the 4GL environment. Objective-C has the facilities to
  265. empower reuse by both inheritance and composition (for both your own 
  266. and/or
  267. 3rd party code). In addition, Objective-C complements and reinforces these
  268. reuse forms through several other reuse mechanisms such as Delegation
  269. (application of dynamism), Notification (application of dynamism),
  270. Categories (language feature), Posing (language feature), Forwarding
  271. (language feature), and better abstraction through Generic Objects (an
  272. outgrowth of many language features). 
  273.  
  274. Generic Objects
  275.     An inspection of NeXT's OO frameworks illustrates how Objective-C
  276. inheritance has been used to reuse code. However it is important to note
  277. that although extremely sophisticated from a functionality standpoint,
  278. Objective-C frameworks (like NeXT's ApplicationKit) paradoxically tend to
  279. be far smaller (with fewer inheritance branches) and simpler than those
  280. implemented in other languages - especially the more static ones such as
  281. C++.   Many Objective-C classes only inherit from the root object. Why
  282. should this be? The reason is that Objective-C classes tend to be highly
  283. "generic." That is, one class can work under many different circumstances
  284. just fine - multiple subclasses aren't required. In most cases, an
  285. Objective-C object can be pulled off the shelf and used as-is (via
  286. composition) without editing a line of code or subclassing it. There
  287. couldn't be a more dramatic demonstration of reuse than the ability of one
  288. class to accomplish the role of dozens.
  289.     The next question is why should Objective-C encourage generic objects? 
  290. The
  291. most basic reason is that the language has the infrastructure to
  292. effectively support dynamic typing and binding. Equally important is 
  293. single
  294. inheritance which means every Objective-C object has a high common
  295. denominator of basic functionality that every other instance can 
  296. absolutely
  297. count on.
  298.     For example, creating universal collections (such as NSSet, NSArray, and
  299. NSDictionary) is routine in Objective-C because the objects they contain
  300. may be dynamically typed (or to put it another way, they are all of type
  301. NSObject). No matter what kind of object you put in these collections, the
  302. collections work. The compiler does not grow the code making up these
  303. collections regardless of how many different types of objects are used
  304. within them (as C++ compilers do with Templates). Developers don't have to
  305. recompile their applications (or NeXT's frameworks) each time a new object
  306. type is encountered that wishes to enter a collection even if that type is
  307. encountered at runtime.
  308.     Objective-C's ability to abstract objects and make them generic is not
  309. limited to the dynamic handling of object types. It is also extended to 
  310. the
  311. dynamic configuration of the methods that an object might wish to send. 
  312. All
  313. Objective-C objects inherit the ability to take an encoded method as an
  314. argument and "perform" the method requested against itself or some other
  315. object. Thus a given object can be customized not only with your own
  316. objects (as "targets") but also with your own methods (as "actions"). 
  317. It is because of this dynamic message delivery support that developers in
  318. the OPENSTEP environment can take off-the-shelf GUI widgets provided by
  319. NeXT's frameworks (like buttons and sliders, etc.) and assemble them
  320. together with other objects (such as your business objects) that were
  321. utterly foreign to the developers of the GUI widgets. In contrast,
  322. virtually every 4GL and 3GL tool forces you to create what are all
  323. essentially special versions of the environment's GUI widgets. In C++ this
  324. means class proliferation (a handler in a subclass for every widget); in
  325. 4GLs it means code scattered in user interface screens. 
  326.  
  327. Delegation
  328.     Delegation is a reuse concept that emphasizes cooperation over
  329. specialization. One common problem facing developers is intervening in the
  330. middle of some operation performed in third party code. For example, you
  331. may find everything about a third party method fine except that some other
  332. operation in your program really ought to be executed, checked, or aborted
  333. depending on how the third party method is proceeding. 
  334.     Usually the solution is to rewrite the third party method from scratch in
  335. a subclass. This may sound straightforward but it usually isn't. The most
  336. obvious problem is that you are now creating another class that you'll 
  337. have
  338. to maintain. But what's worse is that you are inviting disaster because 
  339. you
  340. don't necessarily know enough about the class in question to understand 
  341. the
  342. "context" of the method you want to override in your subclass (such as the
  343. beginning and end conditions on a while loop). 
  344.     If you have source code, you can use that to write your method to set up
  345. the loop properly - but this violates encapsulation and ties your code to
  346. the third party's implementation. If you don't have source code, you can
  347. pretty much forget about being able to override the method successfully
  348. except by pure luck. This is one of the classic problems with
  349. implementation inheritance. 
  350.     Enter Delegation. A Delegate is nothing more than a dynamically bound and
  351. typed object used often in the implementation of Objective-C classes. The
  352. delegate can be any object, perhaps a central controller object or a
  353. business object. Third party objects can send messages to their delegate 
  354. at
  355. appropriate times (such as within a while loop or right before one) giving
  356. the delegate the opportunity to approve, reject, customize, or simply
  357. become synchronized with what's happening in the third party object.
  358. Many OPENSTEP classes use delegation. For instance an NSWindow object may
  359. have a delegate assigned that gets informed whenever the window is
  360. dismissed or asked for approval right before the window is closed. Another
  361. type of delegate method is one that assigns a specific task to the 
  362. delegate
  363. such as handling a particular operation in total. For example, an instance
  364. of the EODisplayGroup class asks its delegate to filter and sort its array
  365. of Enterprise Objects fetched from a database.
  366.  
  367. Notification
  368.     The role of delegates can be organized into three categories: 
  369. observation,
  370. approval, and implementation. However a single delegate isn't always the
  371. best way to achieve observation for the sake of synchronization. What if
  372. many objects wish to be informed of important happenings in the third 
  373. party
  374. object? While approval and implementation imply specific functionality and
  375. a defined role, observation does not. 
  376. To simplify the task of observing activity in somebody else's object, NeXT
  377. has leveraged Objective-C's ability to dynamically assign actions and
  378. targets in a suite of optimized Foundation Framework classes based on the
  379. concept of Notification. These classes include NSNotification,
  380. NSNotificationCenter, and NSNotificationQueue. 
  381.     Objects that wish to let other objects know about what's happening to 
  382. them
  383. merely "post" a notification to the NSNotificationCenter. It is the
  384. NSNotificationCenter's responsibility to inform the registered observers
  385. (if any) that the notification has happened. Thus neither the notifier or
  386. the observer need to know about each other - but they can still
  387. communicate.
  388. Notification combined with Delegation allow graphs of objects (that didn't
  389. know anything about each other at design time) to collaborate and
  390. intimately participate in each other's workings. 
  391.  
  392. Categories
  393.     Categories provide a way to extend classes defined by others without
  394. subclassing. Instead of creating a new class, a Category provides a way to
  395. add methods directly to the existing class.   
  396.     To emphasize the power of Categories and how they differ from subclasses,
  397. consider a situation where a developer wants to augment functionality of a
  398. third-party framework - not only in one class but also among all the
  399. subclasses in a particular inheritance tree. In order to achieve this end,
  400. the developer could elect to subclass every single class underneath the
  401. abstract superclass or violate encapsulation by editing source code
  402. directly inside the abstract superclass. Categories offer a far more
  403. stream-lined solution. When a Category of methods is added to a given
  404. class, all subclasses immediately inherit the new functionality 
  405. implemented
  406. in the Category. Another powerful bonus offered by Categories is that, 
  407. like
  408. Objective-C classes, they may be dynamically loaded at runtime.
  409.  
  410. Posing
  411.     Posing is an Objective-C feature that let's developers create subclasses
  412. that masquerade as though they were members of a superclass. Why might 
  413. this
  414. ability be useful? Consider the situation in which a third party has
  415. created an object (call it Master) that uses another third-party object
  416. (call it Slave) to get something done. You are interested in using Master
  417. as-is but also interested in customizing how Slave behaves. 
  418.     Instead of adding behavior (which categories excel at most), you want to
  419. override some behavior in the Slave so you create a subclass: MySlave. 
  420. This
  421. is all fine except class Master is still using its original class, class
  422. Slave - not your MySlave subclass. So how can the developer achieve the
  423. desired customization while leaving Master untouched? In Objective-C, the
  424. answer is Posing. Posing let's developers add and reliably override 
  425. methods
  426. in a subclass (even leverage the superclass's implementation) and yet tell
  427. the runtime system to use instances of your specialized subclass as though
  428. they were instances of any superclasses in the inheritance hierarchy. You
  429. merely tell your subclass to "poseAs" one of its superclasses.
  430.     With Posing, class Master will use your subclass of Slave (MySlave)
  431. without modification - and do so at runtime, if necessary, without a
  432. recompile. As far as class Master is concerned, it is using class Slave.
  433. Other applications that use class Master but expect the functionality in
  434. class Slave (not MySlave) still can - without making the developer track
  435. two different versions of Master. 
  436.  
  437. Forwarding
  438.     All Objective-C objects inherit the ability to automatically "forward"
  439. messages to other objects on the original target object's behalf. Thanks 
  440. to
  441. the complete type information provided by the runtime, an object can
  442. actually detect if it can't respond to a message sent to it. When an 
  443. object
  444. discovers it can't implement a method, it has a chance to handle the
  445. problem via a custom implementation of the forwardInvocation: method
  446. inherited from the root object.
  447.     How can this enhance reuse? Forwarding enables two or more classes to
  448. collaborate as if they formed one class. However, unlike multiple
  449. inheritance strategies used in other languages, there is no ambiguity 
  450. about
  451. which method gets invoked when both classes implement the same method
  452. because forwarding only occurs when the target of a message can't respond.
  453. Furthermore, collaboration via Forwarding does not lead to the creation of
  454. large, unwieldy classes (which have a tendency to be "dead-ends" in the
  455. inheritance hierarchy). Forwarding keeps implementations in separate,
  456. smaller objects (specialized in doing one area of functionality very well)
  457. but associates the collaborating objects in way transparent to the message
  458. sender.
  459.     An important side benefit of Forwarding is that makes Distributed Object
  460. communication across address spaces transparent to the mesage sender.
  461.  
  462.  
  463.  
  464. III. Performance
  465.  
  466. Objective-C is fast. Faster than any 4GL or p-code interpreted language.
  467. Much of its speed stems from the language's C heritage. However the
  468. object-oriented features of the language benefit immensely from the
  469. utilization of an optimized message delivery system, just-in-time resource
  470. allocation, and sophisticated memory management scheme's available in
  471. NeXT's implementation. 
  472.     When a message is sent to an Objective-C object, the runtime system
  473. attempts to find an implementation for the method requested in the target
  474. object. It does this in manner that enforces the rules of inheritance but
  475. in a dynamically extendable way. 
  476. The runtime system first looks in the target object's class definition for
  477. a method implementation. If not found, it then checks its superclass and
  478. then it's superclass's superclass and so on. Once the runtime system
  479. locates a method implementation, the method is invoked. To accelerate the
  480. message delivery process, the Objective-C runtime system actually caches
  481. the association of methods and the addresses of their implementations. If
  482. the method is found in the cache, an Objective-C message is only slightly
  483. slower than a function call. Once a program has been running for even a
  484. short while, almost all messages will be handled with cached methods. 
  485.     There are other aspects of performance beyond raw computational
  486. horsepower, namely overall throughput and memory consumption. The ability
  487. of Objective-C to exploit dynamic loading of code and object instances 
  488. from
  489. archives, means it is routine for an Objective-C application to load
  490. resources "just in time" when and only if they are required. Parts of an
  491. application that aren't used frequently (like About Panels or Preferences
  492. Dialogs) don't grow the memory footprint at all if not used.
  493.     Another way, Objective-C can help to reduce footprint is via "surrogate"
  494. objects. A surrogate is a lightweight class that uses the Objective-C
  495. Forwarding hook to stand-in for larger objects (such as images or movies).
  496. If the surrogate can't handle a message, it will create an instance of the
  497. heavy-weight class to handle the message on its behalf but only when 
  498. needed
  499. (and do so in a manner transparent to the message sender). 
  500.     NeXT's Objective-C root object also provides mechanisms to address a
  501. problem common to all object-oriented applications: "bad locality of
  502. reference." Applications with bad locality of reference are susceptible to
  503. serious performance degradation due to excessive swapping to disk (an
  504. extremely expensive procedure) and "memory hopping" from method to method
  505. (which defeats popular CPU instruction caching strategies).
  506.     In Objective-C, developers can use Categories to group related methods
  507. together in memory and thus improve locality of reference at the
  508. granularity of a class's internal implementation. In addition,
  509. Objective-C's support for separate allocation & initialzation during 
  510. object
  511. creation encourages memory allocation by "zones" which improve locality of
  512. reference at the granularity of object graphs.  
  513.  
  514.  
  515. - dave
  516.